/*
 * Bit array implementation
 */
#include <stdlib.h>
#include "bitarray.h"
#include "xalloc.h"
#include "contracts.h"

/* Get a new bitarray with everything set to 'false' */
bitarray bitarray_new(){
    return (bitarray) 0;
}

/* Get the ith bit of the bitarray n */
bool bitarray_get(bitarray n, uint8_t i){
// 0 <= i < BITARRAY_LIMIT
    REQUIRES(i < BITARRAY_LIMIT);
    bitarray num = 1;//0x0001
    return (((n >> i) & num) == num);
}


/* Toggle the ith bit of the bitarray n, returning a new bitarray */
/* The old bitarray remains unchanged (this is a persistent data structure) */
bitarray bitarray_flip(bitarray n, uint8_t i){
// 0 <= i < BITARRAY_LIMIT
    REQUIRES(i < BITARRAY_LIMIT);
    bitarray num = 1;//0x0001
    bitarray mask = num << i;
    return n ^ mask;
}

/* Compare two bitvectors for equality. */
bool bitarray_equal(bitarray B1, bitarray B2)
{
  bitarray num = 0;
  return ((B1 ^ B2) == num);
}
